package main

import "fmt"

// address 定义了一个地址结构体，包含省份和城市两个字段
type address struct {
	province string
	city     string
}

// String 方法实现了 fmt.Stringer 接口，返回地址的字符串表示
func (addr address) String() string {
	return fmt.Sprintf("the addr is %s%s", addr.province, addr.city)
}

// printString 函数接受一个 fmt.Stringer 接口类型的参数，并打印其字符串表示
func printString(s fmt.Stringer) {
	fmt.Println(s.String())
}

type person struct {
	name string
	age  uint
}

func main() {
	// 创建一个 address 结构体实例
	addr := address{province: "hb", city: "yuhua"}
	// 直接调用 printString 函数，传入 addr 实例
	printString(addr)
	// 传入 addr 实例的指针，因为 address 类型实现了 String 方法，所以指针也可以调用该方法
	printString(&addr)

	var si fmt.Stringer = address{province: "hb", city: "xinhua"}
	printString(si)
	//sip := &si
	//指向接口的指针永远不可能实现该接口
	//printString(sip)
	p := person{name: "zhangsan", age: 18}
	fmt.Printf("main函数:p的内存地址为%p\n", &p)
	fmt.Println("peerson name :", p.name, ", age:", p.age)
	modifyPerson(p)
	fmt.Println("peerson name :", p.name, ", age:", p.age)
	modifyPerson2(&p)
	fmt.Println("peerson name :", p.name, ", age:", p.age)

	m := make(map[string]int)
	fmt.Printf("main函数:m的内存地址为%p\n", m)
	m["lisi"] = 20
	fmt.Println(m["lisi"])
	modifyMap(m)
	fmt.Println(m["lisi"])
}
func modifyMap(m map[string]int) {
	fmt.Printf("modifyMap函数:m的内存地址为%p\n", m)
	m["lisi"] = 44
}
func modifyPerson(p person) {
	fmt.Printf("modifyPerson函数:p的内存地址为%p\n", &p)
	p.name = "lisi"
	p.age = 20
}
func modifyPerson2(p *person) {
	fmt.Printf("mmodifyPerson2函数:p的内存地址为%p\n", p)
	p.name = "lisi"
	p.age = 20
}
